import java.util.*;

public class Test {
    public static void main(String[] args) {
        /* 1. 两种队列实现对比 */
        Queue<String> queue1 = new LinkedList<>(); // 双向链表节点
        Queue<String> queue2 = new ArrayDeque<>(); // 循环数组，更快更省

        /* 2. 基本 FIFO 操作（返回特殊值版，推荐） */
        queue1.offer("apple");
        queue1.offer("banana");
        queue1.offer("cherry");
        System.out.println("LinkedList队列: " + queue1); // [apple, banana, cherry]

        System.out.println("peek 头元素: " + queue1.peek()); // apple（不删除）
        System.out.println("poll 出队: " + queue1.poll()); // apple（删除）
        System.out.println("poll 后队列: " + queue1); // [banana, cherry]

        /* 3. 抛异常版 API（失败时抛异常而非 null） */
        queue1.add("date");
        System.out.println("remove 头: " + queue1.remove()); // banana
        // queue1.element(); // 查看头，空队列抛 NoSuchElementException

        /* 4. ArrayDeque 当栈也能当队列 */
        ArrayDeque<Integer> deque = new ArrayDeque<>();
        deque.offerLast(1); // 队列尾部
        deque.offerLast(2);
        deque.offerFirst(0); // 队列头部（插队）
        System.out.println("ArrayDeque 头插后: " + deque); // [0, 1, 2]

        /* 5. 一行流：List 去重 → 队列 */
        List<String> dup = List.of("a", "b", "a", "c");
        Queue<String> noDupQueue = new ArrayDeque<>(
                new LinkedHashSet<>(dup)); // 保持插入顺序
        System.out.println("去重+队列: " + noDupQueue); // [a, b, c]

        /* 6. 队列 ↔ 数组 */
        Queue<Integer> q = new ArrayDeque<>(List.of(1, 2, 3));
        Integer[] arr = q.toArray(Integer[]::new);
        System.out.println("队列转数组: " + Arrays.toString(arr));

        /* 7. 遍历（出队顺序） */
        q.forEach(n -> System.out.print(n + " "));
        System.out.println();
    }
}

// LinkedList → 普通 FIFO 队列
// ArrayDeque → 更快、更省的队列（Java 官方推荐替代 LinkedList 当队列用）/
// | 操作 | 抛异常组（失败抛异常）        | 特殊值组（失败返 null/false） | 说明         |
// | -- | ------------------ | -------------------- | ---------- |
// | 增  | `boolean add(E e)` | `boolean offer(E e)` | 推荐 `offer` |
// | 删  | `E remove()`       | `E poll()`           | 推荐 `poll`  |
// | 查头 | `E element()`      | `E peek()`           | 推荐 `peek`  |
